"""
BaoStock日K数据控制器

本文件提供使用BaoStock获取和展示股票日K数据的API接口。
相关知识点：
- FastAPI路由
- RESTful API设计
- 异步编程
"""
from datetime import datetime
from typing import List, Optional
from fastapi import APIRouter, Depends, Request, Query
from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType
from config.get_db import get_db
# from module_admin.annotation.log_annotation import Log  # 暂时注释掉日志注解
from module_login.service.login_service import CheckUserInterfaceAuth
from module_login.service.login_service import CurrentUserModel
from module_login.service.login_service import LoginService
from module_stock.service.baostock_daily_service import BaoStockDailyService
from utils.log_util import logger
from utils.response_util import ResponseUtil


baostockDailyController = APIRouter(
    prefix='/stock/baostock/daily',
    dependencies=[Depends(LoginService.get_current_user)]
)


@baostockDailyController.get(
    '/fetch',
    dependencies=[Depends(CheckUserInterfaceAuth('stock:baostock:daily:fetch'))]
)
# @Log(...)  # 暂时注释掉日志注解
async def fetch_daily_data_from_baostock(
    request: Request,
    symbol: str = Query(..., description='股票代码，如 600000'),
    start_date: Optional[str] = Query(None, description='开始日期，格式 YYYY-MM-DD'),
    end_date: Optional[str] = Query(None, description='结束日期，格式 YYYY-MM-DD'),
    query_db: AsyncSession = Depends(get_db),
    current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
    """
    从BaoStock获取股票日K数据（不保存到数据库）
    
    相关知识点：
    - RESTful API设计
    - 异步编程
    - BaoStock数据获取
    
    参数：
    - symbol: 股票代码，如 "600000"
    - start_date: 开始日期，格式 "YYYY-MM-DD"，可选
    - end_date: 结束日期，格式 "YYYY-MM-DD"，可选
    
    返回：
    - 股票日K数据列表
    """
    try:
        daily_data = await BaoStockDailyService.get_daily_data_from_baostock(
            symbol=symbol,
            start_date=start_date,
            end_date=end_date
        )
        logger.info(f'从BaoStock获取股票 {symbol} 日K数据成功，共 {len(daily_data)} 条')
        return ResponseUtil.success(data=daily_data, msg=f'获取成功，共 {len(daily_data)} 条数据')
    except Exception as e:
        logger.error(f'从BaoStock获取股票 {symbol} 日K数据失败: {e}')
        return ResponseUtil.failure(msg=f'获取失败: {str(e)}')


@baostockDailyController.post(
    '/sync',
    dependencies=[Depends(CheckUserInterfaceAuth('stock:baostock:daily:sync'))]
)
# @Log(...)  # 暂时注释掉日志注解
async def sync_daily_data_from_baostock(
    request: Request,
    symbol: str = Query(..., description='股票代码，如 600000'),
    start_date: Optional[str] = Query(None, description='开始日期，格式 YYYY-MM-DD'),
    end_date: Optional[str] = Query(None, description='结束日期，格式 YYYY-MM-DD'),
    query_db: AsyncSession = Depends(get_db),
    current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
    """
    从BaoStock获取股票日K数据并同步到数据库
    
    相关知识点：
    - RESTful API设计
    - 异步编程
    - BaoStock数据获取
    - 数据库操作
    
    参数：
    - symbol: 股票代码，如 "600000"
    - start_date: 开始日期，格式 "YYYY-MM-DD"，可选
    - end_date: 结束日期，格式 "YYYY-MM-DD"，可选
    
    返回：
    - 同步结果
    """
    try:
        sync_result = await BaoStockDailyService.sync_daily_data_to_db(
            query_db=query_db,
            symbol=symbol,
            start_date=start_date,
            end_date=end_date
        )
        logger.info(f'同步BaoStock股票 {symbol} 日K数据成功: {sync_result.message}')
        return ResponseUtil.success(msg=sync_result.message)
    except Exception as e:
        logger.error(f'同步BaoStock股票 {symbol} 日K数据失败: {e}')
        return ResponseUtil.failure(msg=f'同步失败: {str(e)}')


@baostockDailyController.get(
    '/list',
    dependencies=[Depends(CheckUserInterfaceAuth('stock:baostock:daily:list'))]
)
# @Log(...)  # 暂时注释掉日志注解
async def get_baostock_daily_list(
    request: Request,
    symbol: str = Query(..., description='股票代码，如 600000'),
    start_date: Optional[str] = Query(None, description='开始日期，格式 YYYY-MM-DD'),
    end_date: Optional[str] = Query(None, description='结束日期，格式 YYYY-MM-DD'),
    page_num: int = Query(1, description='当前页码'),
    page_size: int = Query(10, description='每页记录数'),
    query_db: AsyncSession = Depends(get_db),
    current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
    """
    查询BaoStock股票日K数据（分页）
    
    相关知识点：
    - RESTful API设计
    - 异步编程
    - 数据库分页查询
    
    参数：
    - symbol: 股票代码，如 "600000"
    - start_date: 开始日期，格式 "YYYY-MM-DD"，可选
    - end_date: 结束日期，格式 "YYYY-MM-DD"，可选
    - page_num: 当前页码，默认1
    - page_size: 每页记录数，默认10
    
    返回：
    - 分页查询结果
    """
    try:
        result = await BaoStockDailyService.get_baostock_daily_page(
            query_db=query_db,
            symbol=symbol,
            start_date=start_date,
            end_date=end_date,
            page_num=page_num,
            page_size=page_size
        )
        logger.info(f'查询BaoStock股票 {symbol} 日K数据成功，共 {result.total} 条')
        return ResponseUtil.success(data=result)
    except Exception as e:
        logger.error(f'查询BaoStock股票 {symbol} 日K数据失败: {e}')
        return ResponseUtil.failure(msg=f'查询失败: {str(e)}')


@baostockDailyController.get(
    '/detail',
    dependencies=[Depends(CheckUserInterfaceAuth('stock:baostock:daily:detail'))]
)
# @Log(...)  # 暂时注释掉日志注解
async def get_baostock_daily_detail(
    request: Request,
    id: int = Query(..., description='数据ID'),
    query_db: AsyncSession = Depends(get_db),
    current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
    """
    获取BaoStock股票日K数据详情
    
    相关知识点：
    - RESTful API设计
    - 异步编程
    
    参数：
    - id: 数据ID
    
    返回：
    - 数据详情
    """
    try:
        detail = await BaoStockDailyService.get_baostock_daily_detail(
            query_db=query_db,
            id=id
        )
        return ResponseUtil.success(data=detail)
    except Exception as e:
        logger.error(f'获取BaoStock日K数据详情失败: {e}')
        return ResponseUtil.failure(msg=f'获取失败: {str(e)}')


@baostockDailyController.delete(
    '/delete',
    dependencies=[Depends(CheckUserInterfaceAuth('stock:baostock:daily:delete'))]
)
# @Log(...)  # 暂时注释掉日志注解
async def delete_baostock_daily(
    request: Request,
    ids: str = Query(..., description='需要删除的ID，多个用逗号分隔'),
    query_db: AsyncSession = Depends(get_db),
    current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
    """
    删除BaoStock股票日K数据
    
    相关知识点：
    - RESTful API设计
    - 异步编程
    - 数据库删除操作
    
    参数：
    - ids: 需要删除的ID，多个用逗号分隔
    
    返回：
    - 删除结果
    """
    try:
        delete_result = await BaoStockDailyService.delete_baostock_daily(
            query_db=query_db,
            ids=ids
        )
        logger.info(f'删除BaoStock日K数据成功: {delete_result.message}')
        return ResponseUtil.success(msg=delete_result.message)
    except Exception as e:
        logger.error(f'删除BaoStock日K数据失败: {e}')
        return ResponseUtil.failure(msg=f'删除失败: {str(e)}')


@baostockDailyController.post(
    '/batch-sync',
    dependencies=[Depends(CheckUserInterfaceAuth('stock:baostock:daily:batch-sync'))]
)
# @Log(...)  # 暂时注释掉日志注解
async def batch_sync_daily_data_from_baostock(
    request: Request,
    symbols: str = Query(..., description='股票代码列表，多个用逗号分隔，如 600000,600001'),
    start_date: Optional[str] = Query(None, description='开始日期，格式 YYYY-MM-DD'),
    end_date: Optional[str] = Query(None, description='结束日期，格式 YYYY-MM-DD'),
    query_db: AsyncSession = Depends(get_db),
    current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
    """
    批量从BaoStock获取股票日K数据并同步到数据库
    
    相关知识点：
    - RESTful API设计
    - 异步编程
    - 批量数据处理
    
    参数：
    - symbols: 股票代码列表，多个用逗号分隔，如 "600000,600001"
    - start_date: 开始日期，格式 "YYYY-MM-DD"，可选
    - end_date: 结束日期，格式 "YYYY-MM-DD"，可选
    
    返回：
    - 批量同步结果
    """
    try:
        sync_result = await BaoStockDailyService.batch_sync_daily_data_to_db(
            query_db=query_db,
            symbols=symbols,
            start_date=start_date,
            end_date=end_date
        )
        logger.info(f'批量同步BaoStock日K数据成功: {sync_result}')
        return ResponseUtil.success(data=sync_result, msg='批量同步完成')
    except Exception as e:
        logger.error(f'批量同步BaoStock日K数据失败: {e}')
        return ResponseUtil.failure(msg=f'批量同步失败: {str(e)}')


@baostockDailyController.get(
    '/symbols',
    dependencies=[Depends(CheckUserInterfaceAuth('stock:baostock:daily:symbols'))]
)
# @Log(...)  # 暂时注释掉日志注解
async def get_baostock_symbols(
    request: Request,
    query_db: AsyncSession = Depends(get_db),
    current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
    """
    获取已保存的BaoStock日K数据的股票代码列表
    
    相关知识点：
    - RESTful API设计
    - 异步编程
    
    返回：
    - 股票代码列表
    """
    try:
        symbols = await BaoStockDailyService.get_all_symbols(
            query_db=query_db
        )
        logger.info(f'获取BaoStock日K数据股票代码列表成功，共 {len(symbols)} 个')
        return ResponseUtil.success(data=symbols)
    except Exception as e:
        logger.error(f'获取BaoStock日K数据股票代码列表失败: {e}')
        return ResponseUtil.failure(msg=f'获取失败: {str(e)}')

